const Router = require('koa-router');
const router = new Router();
// 加密模块(同类型还有bcrypt<不好下载包>和bcrypt.js)
const crypto = require('crypto');
// 加密密码
const passwordKeyWords = 'koa-password';
// 全球公认头像处理方案(前提是在https://en.gravatar.com/注册过的邮箱)
const gravatar = require('gravatar');
// token鉴权
const jwt = require("jsonwebtoken");
const globalKeys = require("../utils/globalKeys");
// 其他接口需要验证的话(设置为私有接口), 添加一个第二个参数
const passport = require('koa-passport');

// 小程序需要在服务端请求的模块实现
// const request = require("request");

// 导入sql函数
const sql = require("../utils/sql");
// 导入数据模型Schema操作数据库
const { Uid0, Vuer } = require('../db/schema')

/**
 * @api {GET} /api/users + /test 测试接口
 * @apiDescription 测试接口
 * @apiGroup users
 * @apiParam null
 * @apiName 测试
 * @apiSampleRequest /api/users/test
 * @apiVersion 1.0.0
 */
router.get('/test', async ctx => {
    // NOTE: 返回不再是res.jsonle,而是ctx.body = {}
    ctx.status = 200;
    ctx.body = { message: 'user interface is running' }
})

/**
 * @api {POST} /api/users/reg 注册接口
 * @apiDescription 注册接口(3种返回情况,密码加密存储)
 * @apiGroup users
 * @apiName register-user
 * @apiParam { String } username 用户名称
 * @apiParam { String } phone 用户手机号
 * @apiParam { String } password 用户密码
 * @apiSuccessExample { json } Success-response:
 * {
      code: 200,
      status: 0,
      message: '注册成功/已注册/字段不合法',
      result
    }
 * @apiSampleRequest /api/users/reg
 * @apiVersion 1.0.0
 */
router.post("/reg", async (ctx, next) => {
    ctx.status = 201;// 先定义为失败(多个)的status,成功(唯一)的再覆盖它
    const { username, phone, password } = ctx.request.body;
    // 后端验证字段合法性: 推荐正则
    // if (!(phone.trim()) || !(password.trim())) {
    //     ctx.body = {
    //         code: 200,
    //         status: -1,
    //         message: '信息不完善,无法完成注册',
    //         result: null
    //     }
    //     return
    // }
    // NOTICE: 不await,就表示没等待查询异步结束,此时打印的是关于Vuer的Schema的信息
    const findPhoneRes = await Vuer.find({ phone });
    if (findPhoneRes.length > 0) {
        ctx.body = {
            code: 200,
            status: -1,
            message: '用户已经注册,请直接登录',
            result: null
        }
    } else {
        // 1. 先更新再获取uid
        const updateRegUid0 = await Uid0.findOneAndUpdate({
            username: "koaers"
        }, {
            $inc: {
                id: 1
            }
        }, {
            new: true,
            upsert: true,// 不存在就插入
            setDefaultsOnInsert: {
                username: 'koaers',
                id: 0
            },
            select: { _id: 0, __v: 0 }
        })
        // 2. 加密
        const hashReg = crypto.createHmac('sha256', password)
            .update(passwordKeyWords)
            .digest('hex');
        // 3. 如果是邮箱登录,则可以通过插件得到当前邮箱的头像地址-这是全球公认头像的使用
        // (若d的值为404,没找到则显示404图片损坏的图; 而d设置为'mm',没找到头像则显示灰白的默认头像)
        const getAvatarOfReg = gravatar.url(ctx.request.body.email, { s: '200', r: 'pg', d: 'mm' });
        // 通过数据模型先创建文档, 必传项和默认值以及'_id','__v'都会建立好
        const newUser = new Vuer({
            username, phone, password: hashReg, uid: updateRegUid0.id, avatar: getAvatarOfReg
        })

        // 存储
        const result = await newUser.save()
        ctx.status = 200;
        ctx.body = {
            code: 200,
            status: 0,
            message: '用户注册成功',
            result: result.phone
        }
    }
})


/**
 * @api {POST} /api/users/login 登录接口
 * @apiDescription 登录接口(验证加密密码, jwt登录鉴权)
 * @apiGroup users
 * @apiName login-user
 * @apiParam { String } phone 用户手机号
 * @apiParam { String } password 用户密码
 * @apiSuccessExample { json } Success-response:
 * {
    code: 200,
    status: 0,
    message: "登陆成功/用户名或者密码错误/该用户尚未注册/信息不完善,操作失败",
    result: userinfo/null
  }
 * @apiSampleRequest /api/users/login
 * @apiVersion 1.0.0
 */
router.post("/login", async (ctx, next) => {
    ctx.status = 201;
    const { phone, password } = ctx.request.body;
    // 后端验证字段合法性: 推荐正则
    // if (!(phone.trim()) || !(password.trim())) {
    //     ctx.body = {
    //         code: 200,
    //         status: -1,
    //         message: '信息不完善,操作失败',
    //         result: null
    //     }
    //     return
    // }
    // 对password进行加密
    const hashLogin = crypto.createHmac('sha256', password)
        .update(passwordKeyWords)
        .digest('hex');
    // 查找为0则不显示
    const findLoginUsers = await sql.find(Vuer, { phone }, { _id: 0, __v: 0 });
    if (findLoginUsers.length > 0) {
        if (findLoginUsers[0].password === hashLogin) {
            // 把登录成功的用户名放到session里
            // ctx.request.session.user = phone;
            // 制作令牌(token解析之后会得到第一个参数集合的内容; 关键字|密钥; 过期时间)
            const payload = { phone, time: Date.now() };
            const tokenOfLogin = jwt.sign(payload, globalKeys.secretOrKeyOfJWT, { expiresIn: 3600 * 12 });
            // ctx.response.cookie("token", token);
            // [koa中设置session和cookie](https://blog.csdn.net/qq_37261367/article/details/88304610)
            // 返回值:
            ctx.status = 200;
            ctx.body = {
                code: 200,
                status: 0,
                message: "登陆成功",
                result: { ...findLoginUsers, token: 'Bearer ' + tokenOfLogin }
            }
        } else {
            ctx.body = {
                code: 200,
                status: -1,
                message: "用户名或者密码错误",
                result: null
            }
        }
    } else {
        ctx.body = {
            code: 200,
            status: -1,
            message: "该用户尚未注册",
            result: null
        }
    }
})


router.get("/userinfo", passport.authenticate('jwt', { session: false }), async ctx => {
    ctx.body = {
        code: 200,
        result: ctx.state.user
    }
})

/**
 * @api {post} /users/quit 退出登录接口
 * @apiDescription 退出登录接口
 * @apiGroup users
 * @apiName quit-user
 * @apiSuccessExample { json } Success-response:
 * res.json({
    code: 200,
    status: 0,
    message: '成功退出登录',
    result: null
   })
 * @apiSampleRequest /users/quit
 * @apiVersion 1.0.0
 */
// router.post("/quit", (req, res) => {
//   req.session.user = "";
//   if (req.cookies.token) {
//     res.cookie("token", "")
//   }
//   res.json({
//     code: 200,
//     status: 0,
//     message: '成功退出登录',
//     result: null
//   })
// })

/**
 * 小程序登录
 */
// router.get("/login",(req,res)=>{
// 	var code = req.query.code;
// 	var id ='wx92a5a8eeaf5802ff';  //appid
// 	var secret ='98828f2f5887455fb18b21a1c596b113'; //appsecret
// 	var url=`https://api.weixin.qq.com/sns/jscode2session?appid=${id}&secret=${secret}&js_code=${code}&grant_type=authorization_code`
// 	request.get(url,(err,response,body)=>{
// 		var obj =JSON.parse(body);  //body里就含有openid session_key
// 		 var token = jwt.sign({username:obj.openid,time:Date.now()},"haha",{expiresIn:10000});
// 		res.json({   //登录成功
// 			status:0,
// 			 data:{
// 			 	login:true,
// 				 token
// 			 }
// 		})
// 	})
// })



// 通过router.routes这个方法统一导出(而express直接导出router即可)
module.exports = router.routes();
